'use strict';
const {
  Model
} = require('sequelize');
const bcrypt = require('bcryptjs');
module.exports = (sequelize, DataTypes) => {
  class User extends Model {
    /**
     * Helper method for defining associations.
     * This method is not a part of Sequelize lifecycle.
     * The `models/index` file will call this method automatically.
     */
    static associate(models) {
      // define association here
    }
  }
  User.init({
    email: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
      validate: {
        notEmpty: {
          msg: '邮箱不能为空'
        },
        notNull: {
          msg: '邮箱不能为空'
        },
        isUnique: async (value, next) => {
          const user = await User.findOne({ where: { email: value } });
          if (user) {
            return next('邮箱已存在');
          }
          next();
        }
      },
    },
    username: {
      type: DataTypes.STRING,
      allowNull: false,
      unique: true,
      validate: {
        notNull: {
          msg: '用户名不能为空'
        },
        len: {
          args: [2, 20],
          msg: '用户名长度必须在2-20个字符之间'
        }
      },
    },
    password: {
      type: DataTypes.STRING,
      allowNull: false,
      validate: {
        notEmpty: {
          msg: '密码不能为空'
        },
        notNull: {
          msg: '密码不能为空'
        },
        set(value) {
          if (value.length < 6) {
            throw new Error('密码长度必须大于6位');
          }
          // 使用相同的盐值进行加密
          const salt = bcrypt.genSaltSync(10);
          const hash = bcrypt.hashSync(value, salt);
          this.setDataValue('password', hash);
        }
      },
    },
    nickname: {
      type: DataTypes.STRING,
      allowNull: true,
      defaultValue: '',
      // validate: {
      //   notEmpty: {
      //     msg: '昵称不能为空'
      //   },
      //   notNull: {
      //     msg: '昵称不能为空'
      //   },
      //   len: {
      //     args: [1, 10],
      //     msg: '昵称长度必须在1到10之间'
      //   }
      // }
    },
    sex: {
      type: DataTypes.TINYINT,
      allowNull: true,
      // validate: {
      //   notEmpty: {
      //     msg: '性别不能为空'
      //   },
      //   notNull: {
      //     msg: '性别不能为空'
      //   },
      //   isIn: {
      //     args: [[0, 1]],
      //     msg: '性别必须是0或1'
      //   }
      // }
    },
    company: {
      type: DataTypes.STRING,
      allowNull: true,
    },
    introduce: {
      type: DataTypes.TEXT,
      allowNull: true,
    },
    role: {
      type: DataTypes.ENUM('admin', 'user'),
      allowNull: false,
      defaultValue: 'user',
      validate: {
        isIn: {
          args: [['admin', 'user']],
          msg: '角色必须是 admin 或 user'
        }
      }
    },
    avatar: {
      type: DataTypes.STRING,
    },
  }, {
    sequelize,
    modelName: 'User',
  });
  return User;
};